相关文章

*   [Users and Groups (简体中文)](/index.php/Users_and_Groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Users and Groups (简体中文)")
*   [su](/index.php/Su "Su")

**翻译状态：** 本文是英文页面 [Sudo](/index.php/Sudo "Sudo") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)")，最后翻译时间：2016-06-13，点击[这里](https://wiki.archlinux.org/index.php?title=Sudo&diff=0&oldid=437107)可以查看翻译后英文页面的改动。

[sudo](http://www.gratisoft.us/sudo/)(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或他用户执行某些（或所有）命令，同时还能够对命令及其参数提供审核跟踪。

用户可以选择用 [su](/index.php/Su "Su") 切换到 root 用户运行命令，但是这种方式会启动一个 root shell 并允许用户运行之后的所有的命令。而 sudo 可以针对单个命令、仅在需要时授予临时权限，减少因为执行错误命令损坏系统的可能性。sudo 也能以其他用户身份执行命令并且记录用户执行的命令，以及失败的权限申请。

## Contents

*   [1 安装](#.E5.AE.89.E8.A3.85)
*   [2 使用](#.E4.BD.BF.E7.94.A8)
*   [3 配置](#.E9.85.8D.E7.BD.AE)
    *   [3.1 查看当前设置](#.E6.9F.A5.E7.9C.8B.E5.BD.93.E5.89.8D.E8.AE.BE.E7.BD.AE)
    *   [3.2 使用 visudo](#.E4.BD.BF.E7.94.A8_visudo)
    *   [3.3 设置示例](#.E8.AE.BE.E7.BD.AE.E7.A4.BA.E4.BE.8B)
    *   [3.4 sudoers文件默认权限](#sudoers.E6.96.87.E4.BB.B6.E9.BB.98.E8.AE.A4.E6.9D.83.E9.99.90)
    *   [3.5 密码过期时间](#.E5.AF.86.E7.A0.81.E8.BF.87.E6.9C.9F.E6.97.B6.E9.97.B4)
*   [4 使用技巧](#.E4.BD.BF.E7.94.A8.E6.8A.80.E5.B7.A7)
    *   [4.1 bash 自动补全支持](#bash_.E8.87.AA.E5.8A.A8.E8.A1.A5.E5.85.A8.E6.94.AF.E6.8C.81)
    *   [4.2 跨终端sudo](#.E8.B7.A8.E7.BB.88.E7.AB.AFsudo)
    *   [4.3 环境变量](#.E7.8E.AF.E5.A2.83.E5.8F.98.E9.87.8F)
    *   [4.4 传递命令别名](#.E4.BC.A0.E9.80.92.E5.91.BD.E4.BB.A4.E5.88.AB.E5.90.8D)
    *   [4.5 使用root密码](#.E4.BD.BF.E7.94.A8root.E5.AF.86.E7.A0.81)
    *   [4.6 禁止root登陆](#.E7.A6.81.E6.AD.A2root.E7.99.BB.E9.99.86)
        *   [4.6.1 gksu](#gksu)
        *   [4.6.2 kdesu](#kdesu)
    *   [4.7 让 sudo 使用 /etc/sudoers.d 中的文件](#.E8.AE.A9_sudo_.E4.BD.BF.E7.94.A8_.2Fetc.2Fsudoers.d_.E4.B8.AD.E7.9A.84.E6.96.87.E4.BB.B6)
*   [5 疑难解答](#.E7.96.91.E9.9A.BE.E8.A7.A3.E7.AD.94)
    *   [5.1 SSH TTY 问题](#SSH_TTY_.E9.97.AE.E9.A2.98)
    *   [5.2 权限 Umask](#.E6.9D.83.E9.99.90_Umask)
    *   [5.3 默认 skeleton 文件](#.E9.BB.98.E8.AE.A4_skeleton_.E6.96.87.E4.BB.B6)

## 安装

[安装](/index.php/%E5%AE%89%E8%A3%85 "安装")软件包 [sudo](https://www.archlinux.org/packages/?name=sudo)。

## 使用

在配置之前，普通用户还无法使用sudo。所以请认真阅读配置部分。

普通用户只需在命令前加上`sudo`，即可使用 root 特权执行命令：

```
$ sudo *cmd*

```

参见：[sudo 手册](http://www.gratisoft.us/sudo/man/sudo.html)。

## 配置

有关配置和密码过期等问题的更多信息，请阅读 [man sudoers](http://www.sudo.ws/man/1.8.13/sudoers.man.html)。

### 查看当前设置

命令 `sudo -ll` 可以显示当前的 sudo 配置; 命令 `sudo -lU *user*` 可以查看某个特定用户的设置。

### 使用 visudo

sudo的配置文件是`/etc/sudoers`。`visudo`会锁住`sudoers`文件，保存修改到临时文件，然后检查文件格式，确保正确后才会覆盖`sudoers`文件。必须保证`sudoers`格式正确，否则sudo将无法运行。

**警告:** `/etc/sudoers`格式错误会导致sudo不可用。**必须**使用`visudo`编辑该文件防止出错。

`visudo`调用的默认编辑器是`vi`。官方仓库里的 sudo 编译时开启了`--with-env-editor`，会采用环境变量 `VISUAL` 和 `EDITOR`的设置。如果设置了`VISUAL` 就不会使用`EDITOR`。

如果要临时使用其他编辑器，在该命令前加上`EDITOR`环境变量即可。例如，要使用 `nano`，用root运行以下命令：

```
# EDITOR=nano visudo

```

要永久设置编辑器，请查看 [定义本地环境变量](/index.php/Environment_variables#Defining_variables "Environment variables").

系统级的设置可以把编辑器设置到 `/etc/sudoers`。以 `nano` 为例，使用`visudo`打开该文件，加入以下内容：

```
# Defaults specification
# Reset environment by default
Defaults      env_reset
# Set default EDITOR to vim, and do not allow visudo to use EDITOR/VISUAL.
Defaults      editor=/usr/bin/nano, !env_editor

```

### 设置示例

要为某个用户可以执行所有命令，在配置文件中加入：

```
用户名   ALL=(ALL) ALL

```

如果只想允许以某个主机名登录用户执行命令：

```
用户名   主机名=(ALL) ALL

```

允许wheel[用户组](/index.php/Groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Groups (简体中文)")成员无密码使用sudo：

```
%wheel      ALL=(ALL) NOPASSWD: ALL

```

要不询问某个用户的密码:

```
Defaults:USER_NAME      !authenticate

```

只为用户启用部分命令的执行权限：

```
用户名 主机名=/sbin/halt,/sbin/poweroff,/sbin/reboot,/usr/bin/pacman -Syu

```

**注意:** 最后的设置会覆盖前面的设置，所以限定多的配置应该放到配置文件的后面。

只为某个主机名登录用户启用部分命令的执行权限，不用输入密码：

```
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

```

更详细的`sudoers`范例，参见[本页](http://www.gratisoft.us/sudo/sample.sudoers)。此外，更多信息参见：[sudoers 手册](http://www.gratisoft.us/sudo/man/sudoers.html)。

### sudoers文件默认权限

sudoers文件的属主和属组ID必须都是0，文件权限位是0440（-r--r-----）。如果你不小心改变了默认权限，应当立即恢复它们：

```
# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers

```

### 密码过期时间

用户可以修改sudo记录密码的时间。使用`visudo`命令将如下内容加入`/etc/sudoers`：

```
Defaults:用户名 timestamp_timeout=20

```

对该用户，sudo将记录密码20分钟。时间值也可以是小数。

**提示：** 如果timestamp_timeout设置为0，sudo总是询问密码。

## 使用技巧

### bash 自动补全支持

详情参见：[bash (简体中文)#自动命令补全](/index.php/Bash_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E8.87.AA.E5.8A.A8.E5.91.BD.E4.BB.A4.E8.A1.A5.E5.85.A8 "Bash (简体中文)")。

### 跨终端sudo

**警告:** 此举使得所有进程都使用同一个sudo任务。

如果不想每次启动新终端都重新输入密码，在配置文件中禁止**tty_tickets**即可：

```
Defaults !tty_tickets

```

### 环境变量

当前用户的环境变量不会应用到sudo启动的程序，除非使用`-E`选项：

```
$ sudo -E pacman -Syu

```

如果经常需要这样做，可以在`~/.bashrc`（或其他shell配置文件）中加入命令别名：

```
alias sudo="sudo -E"

```

在`/etc/sudoers`中添加以下内容作用相同：

```
Defaults !env_reset

```

可以把需要传递环境变量的命令设置到`env_keep`：

```
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

```

### 传递命令别名

当前用户的命令别名不会应用到sudo。如果需要这样，只需在`~/.bashrc`或者`/etc/bash.bashrc`中加入：

```
alias sudo='sudo '

```

### 使用root密码

默认sudo询问用户密码。添加`targetpw` 或 `rootpw`到配置文件的“Defaults”部分，可以让sudo询问root密码：

```
Defaults targetpw

```

可以限定特定的组使用 root 密码：

```
Defaults:%wheel targetpw
%wheel ALL=(ALL) ALL

```

### 禁止root登陆

**警告:** ArchLinux用户最好不要禁用root用户，出问题就麻烦大了。

有了sudo，用户也许希望禁止使用root登陆。没有了root用户，黑客就不知道管理员账户的名字了。

**警告:** 务必在禁用root**之前**配置好其他用户的权限！

使用`passwd`命令锁住root用户：

```
# passwd -l root

```

下列命令解锁root用户：

```
$ sudo passwd -u root

```

或者，编辑`/etc/shadow`文件，将root的加密口令列替换为“!”：

```
root:!:12345::::::

```

要再次启用sudo，重新设置其密码即可：

```
$ sudo passwd root

```

#### gksu

要设置 *gksu* 使用 sudo 而不是 root:

```
$ gconftool-2 --set --type boolean /apps/gksu/sudo-mode true

```

#### kdesu

KDE下常用 kdesu 以 root 权限执行图形程序。默认情况下，即使root账户被禁用，kdesu仍会尝试使用su切换root。需要配置kdesu以使用sudo，创建/编辑`~/.config/kdesurc` (KDE4 的 `~/.kde4/share/config/kdesurc`)，加入：

```
[super-user-command]
super-user-command=sudo

```

或者使用下面命令，KDE 4 使用 kwriteconfig

```
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo

```

### 让 sudo 使用 /etc/sudoers.d 中的文件

*sudo* 可以解析 `/etc/sudoers.d/` 目录中的文件，这样就不需要编辑单一的 `/etc/sudoers` 文件，可以单独修改一个设置然后放入此目录。目录中配置的格式和 `/etc/sudoers`一样, 优点包括：

*   不需要编辑 {ic|sudoers.pacnew}} 文件;
*   如果新配置有问题，可以删除这个文件而不用编辑 `/etc/sudoers`.

`/etc/sudoers.d/` 目录中的文件是按字母顺序加载的，`.` 或 `~` 开头的文件会被跳过。文件名应该以双字母开头，例如 `01_foo`，请注意配置文件的顺序以避免相互覆盖。

## 疑难解答

### SSH TTY 问题

远程执行命令时，SSH默认不会分配tty。没有tty，sudo就无法在获取密码时关闭回显。使用`-tt`选项强制SSH分配tty（使用两次`-tt`）。

另一方面，sudoers中的`Defaults`选项`requiretty`要求只有拥有tty的用户才能使用sudo。可以通过`visudo`编辑配置文件，禁用这个选项：

```
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. 
# You have to run "ssh -t hostname sudo <cmd>".
#
# Defaults    requiretty

```

### 权限 Umask

Sudo 会统一用户的 [umask](/index.php/Umask "Umask") 值和它自己的 umask (默认是 0022)。这会阻止 sudo 创建比该用户的 umask 允许的打开权限更多的文件。这默认是合理的，因为没有使用自定义 umask。但是这可能导致用sudo运行一个命令和root运行一个命令建立的文件权限不同。如果这导致了问题，sudo 提供了一个方法来修复 umask，即使想要的 umask 比用户指定的 umask 权限还要多。添加下面内容 (使用 `visudo`) 会覆盖 sudo 的默认行为：

```
Defaults umask = 0022
Defaults umask_override

```

这会将 sudo 的 umask 设置为 root 的默认 umask (0022)，覆盖掉默认行为，无论用户的umask设置成什么都会使用这里设定的值。

### 默认 skeleton 文件

[此页面](http://www.sudo.ws/sudo/sudoers.man.html#x5355444f455253204f5054494f4e53) 列出了所有可用配置。